package com.ht.modules.system.online.codegenerate.generate.impl;

import com.ht.modules.system.online.cgform.model.OnlGenerateModel;
import com.ht.modules.system.online.codegenerate.a.ConfigVo;
import com.ht.modules.system.online.codegenerate.database.DbReadTableUtil;
import com.ht.modules.system.online.codegenerate.generate.IGenerate;
import com.ht.modules.system.online.codegenerate.generate.a.LoadTemplatesUtil;
import com.ht.modules.system.online.codegenerate.generate.impl.a.FileTemplate;
import com.ht.modules.system.online.codegenerate.generate.pojo.ColumnVo;
import com.ht.modules.system.online.codegenerate.generate.pojo.TableVo;
import com.ht.modules.system.online.codegenerate.generate.util.NonceUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
@Slf4j
public class CodeGenerateOne extends FileTemplate implements IGenerate {
    @Autowired
    @Lazy
    private DbReadTableUtil dbReadTableUtil;
    private final ConfigVo configVo = new ConfigVo();

    @Override
    public Map<String, Object> queryCodeGenerateInfo(TableVo tableVo, List<ColumnVo> columns, List<ColumnVo> originalColumns) {
        try {
            Map<String, Object> codeGenerateInfo = new HashMap<>();
            codeGenerateInfo.put("bussiPackage", configVo.bussiPackage);
            codeGenerateInfo.put("entityPackage", tableVo.getEntityPackage());
            codeGenerateInfo.put("entityName", tableVo.getEntityName());
            codeGenerateInfo.put("tableName", tableVo.getTableName());
            codeGenerateInfo.put("primaryKeyField", configVo.primaryKeyField);
            if (tableVo.getFieldRequiredNum() == null) {
                tableVo.setFieldRequiredNum(configVo.fieldRequiredNum);
            }
            if (tableVo.getSearchFieldNum() == null) {
                tableVo.setSearchFieldNum(configVo.pageSearchFiledNum);
            }
            if (tableVo.getFieldRowNum() == null) {
                tableVo.setFieldRowNum(configVo.fieldRowNum);
            }
            codeGenerateInfo.put("tableVo", tableVo);

            if (columns == null || columns.isEmpty()) {
                columns = dbReadTableUtil.a(tableVo.getTableName());
            }
            codeGenerateInfo.put("columns", columns);
            if (originalColumns == null || originalColumns.isEmpty()) {
                originalColumns = dbReadTableUtil.readOriginalTableColumn(tableVo.getTableName());
            }
            codeGenerateInfo.put("originalColumns", originalColumns);
            for (ColumnVo var3 : originalColumns) {
                if (var3.getFieldName().equalsIgnoreCase(configVo.primaryKeyField)) {
                    codeGenerateInfo.put("primaryKeyPolicy", var3.getFieldType());
                }
            }
            long var5 = NonceUtils.c() + NonceUtils.h();
            codeGenerateInfo.put("serialVersionUID", String.valueOf(var5));
            log.info("load template data: {}", codeGenerateInfo);
            return codeGenerateInfo;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void generateCodeFile(OnlGenerateModel onlGenerateModel, TableVo tableVo, List<ColumnVo> columns, List<ColumnVo> originalColumns) {
        log.info(" ---- Code ---- Generation ----[单表模型:{}]------- ", tableVo.getTableName());
        Map<String, Object> codeGenerateInfo = this.queryCodeGenerateInfo(tableVo, columns, originalColumns);
        LoadTemplatesUtil loadTemplatesUtil = new LoadTemplatesUtil();
        loadTemplatesUtil.setTemplatePath(configVo.templatePath);
        this.generateCodeFiles(loadTemplatesUtil, configVo.projectPath, codeGenerateInfo, configVo);
        log.info(" ----- generate  code  success =======> 表名：{} ", tableVo.getTableName());
    }
}
